import { instantiate, Prefab } from 'cc';
import { app } from '../../application';
import { HintTinyLoadingInfo } from '../../declarations';
import { ccclass, ccmodifier } from '../../decorators';
import { HintTinyLoading } from './HintTinyLoading';
import { HintStack } from './HintStack';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.11.02
 * - 名称: HintTinyLoadingStack
 * - 描述: 小型加载提示堆栈
 * - 说明: 小型加载提示同时只能显示一个，新的提示会覆盖旧的提示
 * - 注意: 需要先初始化，设置一个模板
 */
@ccclass()
@ccmodifier('HintTinyLoadingStack')
export class HintTinyLoadingStack extends HintStack {
    /** 当前组件 */
    protected _page: HintTinyLoading | null;

    /**
     * 注册
     * @param cfg 小型加载提示堆栈配置
     */
    async register(cfg: HintTinyLoadingInfo) {
        // 如果有正在显示的提示，则需要移除
        if (this._page) {
            this._page.node.destroy();
            this._page = null;
        }

        // 添加提示
        const prefab = await app.resLoader.loadOne({ path: cfg.path, bundle: cfg.bundle, type: Prefab });
        if (prefab && prefab.data.getComponent(HintTinyLoading)) {
            const node = instantiate(prefab);
            this.node.addChild(node);
            this._page = node.getComponent(HintTinyLoading)!;
            await this.hide();
        }
    }

    /** 显示 */
    async showLoading() {
        if (this._page) {
            await this.show();
            this._page.show();
        }
    }

    /** 隐藏 */
    async hideLoading() {
        if (this._page) {
            await this.hide();
            this._page.hide();
        }
    }

    async enter(): Promise<void> {
        await this.hide();
        this.logger.debug('进入舞台');
    }
}
